home *** CD-ROM | disk | FTP | other *** search
/ DP Tool Club 19 / CD_ASCQ_19_010295.iso / dos / prg / pas / swag / memory.swg / 0061_Free Stack Space.pas < prev    next >
Pascal/Delphi Source File  |  1994-08-24  |  2KB  |  109 lines

  1. {
  2. Here is some code I use to find out how many stack space is used after a
  3. run. I guess it won't work in protected mode. Be aware
  4. it isn't byte-resolution ! I'd like to hear about enhancements.
  5. }
  6.  
  7. unit Stack;
  8. interface
  9.   procedure InitStack;
  10.   procedure TestStack;
  11. implementation
  12.  
  13. (*
  14. Routinen zum Pruefen des Stackbedarfs
  15. Wilfried F?rber, Isar Software GmbH
  16. Ringeisstr. 2a, 8000 Muenchen 2
  17. August 1991
  18.  
  19. Routinen zum Pruefen, wieviel Stack wirklich benoetigt wird.
  20. Willfried F?rber, Isar Software GmbH, August 1991
  21. Port von C nach Pascal: Jacques NOMSSI NZALI,
  22. email: nomssi@physikus.physik.tu-chemnitz.de
  23. *)
  24. Var STKHQQ : word;
  25.  
  26. const
  27.   stacktext : packed array[1..4] of char = 'STAC';
  28.   MAXSTACK = (1024 div 4)*64;
  29.  
  30. function atopsp : Word; assembler;
  31. asm
  32.   mov ax, sp
  33. end;
  34.  
  35. procedure InitStack;
  36. var
  37.   AktStack,
  38.   Anzahl : Word;
  39. begin
  40.   STKHQQ := StackLimit;
  41.   asm
  42.     mov AktStack, bp
  43.   end;
  44.   Anzahl := (AktStack - STKHQQ) div 4;
  45.   asm
  46.     mov cx, [Anzahl]
  47.     mov di, [STKHQQ]
  48.     mov ax, ss
  49.  
  50.     mov es, ax
  51.     mov ax, Offset StackText
  52.     @L1:
  53.     mov si, ax
  54.     movsw
  55.     movsw
  56.     loop @L1
  57.   end;
  58. end;
  59.  
  60. function StackSize : Word;
  61. begin
  62.   StackSize := - STKHQQ + atopsp;
  63. end;
  64.  
  65. function StackUsed : Word;
  66. var
  67.   StackFrei,
  68.   StackMax : Word;
  69. Begin
  70.   StackMax := StackSize;
  71.   asm
  72.     mov cx, MAXSTACK
  73.     mov di, [STKHQQ]
  74.     mov ax, ss
  75.  
  76.     mov es, ax
  77.     mov ax, Offset Stacktext
  78.   @L1:
  79.     mov si, ax
  80.     cmpsw
  81.     jnz @L2
  82.     cmpsw
  83.     loope @L1
  84.   @L2:
  85.     sub cx, MAXSTACK
  86.     not cx
  87.     mov [StackFrei], cx
  88.   end;
  89.   StackFrei := StackFrei*4;
  90.   StackUsed := StackMax - StackFrei;
  91. end;
  92.  
  93. procedure TestStack;
  94. var
  95.   StackVerb, _MaxStack : Word;
  96. begin
  97.   _MaxStack := StackSize;
  98.   StackVerb := StackUsed;
  99.   WriteLn('STACK-VERBRAUCHSTEST ---------------------- ');
  100.   WriteLn('Programmstack :', _MaxStack);
  101.   WriteLn('Es wurden ca. ',StackVerb,' Bytes benoetigt.');
  102.   WriteLn('Stack-Reserve :',MaxStack-StackVerb,' Bytes.');
  103.   ReadLn;
  104. end;
  105.  
  106. begin
  107.   InitStack;
  108. end.
  109.